perm filename MIXMLD[MIX,SYS] blob sn#020803 filedate 1972-02-08 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00004 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00002 00002	OPDEF	OUTDEC	[PUSHJ  P, .]
 00007 00003	OPLIST:	SIXBIT	/ADD/
 00012 00004	GOTOP:	0501	 ADD
 00016 ENDMK
⊗;
OPDEF	OUTDEC	[PUSHJ  P, .]
	IDIVI	10, =10
	HRLZM	11, (P)
	SKIPE	10
	PUSHJ	P, .-3
	HLRZ	11, (P)
	ADDI	11, 60
	OUTCHR	11
	POPJ	P,

QMLD:	INIT	0, 10			; init in image mode
	SIXBIT	/DSK/
	MLDBLK
	JRST	ZDISK			; error return
	PUSHJ	P,RESCN			;*RES* LOOK FOR NAME ON PREV LINE
	PUSHJ	P,FINFI2		;*RES* LOOK IT UP
	JRST	.+3			;*RES*
	OUTSTR	[ASCIZ  ⊗MIX-LOAD FILE: ⊗]
	FINFO				; get file data
	HRLZI	10, 'MLD'
	MOVEM	10, BLK+1
	MOVE	10, [XWD BLK, MLDBLK+3]	; put data into MLDBLK
	BLT	10, MLDBLK+6
	LOOKUP	0, MLDBLK+3		; lookup file
	JRST	.-7			; error → try again

MBOX:	PUSHJ	P, MLDIN		; get word
	JUMPL	10, MCHAIN		; <0 → chain
	JUMPE	10, MSTART		; 0 → end of file
	MOVEM	10, MLDBOX		; set up box head
	MOVNI	11, 17			; counter
	PUSHJ	P, MLDIN		; get word
	MOVEM	10, MLDBOX+20(11)	; put into box
	AOJL	11, .-2			; back for more
	HLRZ	10, MLDBOX		; set up BLT pointer
	HRRZ	11, MLDBOX
	JUMPE	11, MBOX		; 0 → empty box
	ADD	11, 10
	SOJ	11,
	ADD	10, [XWD  MLDBOX+1, MC0000]
	BLT	10, MC0000 (11)		; move box into core
	JRST	MBOX			; back for more

MCHAIN:	HRRZ	12, 10			; this is the value of the symbol
	TLZ	10, 400000		; mask out "-"
	MOVEI	13, =4000		; want to limit possible number of links in chain

CHAIN1:	HLRZ	11, 10			; get address of MIX word
	CAIL	11, 0			; test for out-of-bounds
	CAILE	11, =3999
	JRST	BADCHN
	SOJL	13, BADCHN		; also test for too many links
	MOVE	10, MC0000 (11)		; get next chain address
	HRLM	12, MC0000 (11)		; put real symbol value into MIX word
	JUMPL	10, MBOX		; "-" → end of chain
	JRST	CHAIN1			; back for more of chain

MSTART:	PUSHJ	P, MLDIN		; get starting address
	ADDI	10, MC0000		; relocate into MIX core
	MOVEM	10, MLDPC0		; save it

	movei	11, symtab		; output first section of symbol table
	movei	12, linked-symtab	; this many entries
mst1:	pushj	p, mldin		; output it
	skipe	10			; if there is an address,
	addi	10, linked-4		; make it real
	movem	10, (11)		; this is the pointer
	sosle	12			; any more words left?
	aoja	11, mst1		; yes

	movei	11, linked		; output second section of symbol table
	movei	12, 600			; this many entries
mst2:	pushj	p, mldin		; output it
	trne	10, 777777		; is there an address in the right half?
	addi	10, linked-4		; yes → make it real
	movem	10, (11)		; get first word of entry
	for x←1,3
{	pushj	p, mldin
	movem	10, (11) x		; get rest of entry
}
	addi	11, 4			; ready for next entry
	sosle	12			; any more?
	jrst	mst2			; yes → get them

	MOVE	PC, MLDPC0		; set PC
	RELEAS	0, 0			; release i/o channel
	JRST	BUTTON	

BADCHN:	OUTSTR	[ASCIZ ⊗
#ERROR: INVALID CHAIN FOR SYMBOL WITH VALUE: ⊗]
	MOVE	10, 12
	OUTDEC
	SETZ	10,
	JRST	MSTART+1

MLDPC0:	0

QPCMLD:	MOVE	PC, MLDPC0		; set PC
	JRST	BUTTON

MLDIN:	SOSG	MLDBLK+2		; decrement character count
	IN	0,			; count exhausted, next buffer
	JRST	.+2			; success
	JRST	ZMLD			; error
	ILDB	10, MLDBLK+1		; get input word
	POPJ	P,			; return

MLDBOX:	BLOCK	20

MLDBLK:	BLOCK	7

symtab:	block	400			; this is the symbol table
linked:	block	600*4
OPLIST:	SIXBIT	/ADD/
	SIXBIT	/ALF/

	SIXBIT	/CHAR/
	SIXBIT	/CMP1/
	SIXBIT	/CMP2/
	SIXBIT	/CMP3/
	SIXBIT	/CMP4/
	SIXBIT	/CMP5/
	SIXBIT	/CMP6/
	SIXBIT	/CMPA/
	SIXBIT	/CMPX/
	SIXBIT	/CON/

	SIXBIT	/DEC1/
	SIXBIT	/DEC2/
	SIXBIT	/DEC3/
	SIXBIT	/DEC4/
	SIXBIT	/DEC5/
	SIXBIT	/DEC6/
	SIXBIT	/DECA/
	SIXBIT	/DECX/
	SIXBIT	/DIV/

	SIXBIT	/END/
	SIXBIT	/ENN1/
	SIXBIT	/ENN2/
	SIXBIT	/ENN3/
	SIXBIT	/ENN4/
	SIXBIT	/ENN5/
	SIXBIT	/ENN6/
	SIXBIT	/ENNA/
	SIXBIT	/ENNX/
	SIXBIT	/ENT1/
	SIXBIT	/ENT2/
	SIXBIT	/ENT3/
	SIXBIT	/ENT4/
	SIXBIT	/ENT5/
	SIXBIT	/ENT6/
	SIXBIT	/ENTA/
	SIXBIT	/ENTX/
	SIXBIT	/EQU/

	SIXBIT	/FADD/
	SIXBIT	/FCMP/
	SIXBIT	/FDIV/
	SIXBIT	/FMUL/
	SIXBIT	/FSUB/

	SIXBIT	/HLT/

	SIXBIT	/IN/
	SIXBIT	/INC1/
	SIXBIT	/INC2/
	SIXBIT	/INC3/
	SIXBIT	/INC4/
	SIXBIT	/INC5/
	SIXBIT	/INC6/
	SIXBIT	/INCA/
	SIXBIT	/INCX/
	SIXBIT	/IOC/

	SIXBIT	/J1E/
	SIXBIT	/J1N/
	SIXBIT	/J1NN/
	SIXBIT	/J1NP/
	SIXBIT	/J1NZ/
	SIXBIT	/J1O/
	SIXBIT	/J1P/
	SIXBIT	/J1Z/

	SIXBIT	/J2E/
	SIXBIT	/J2N/
	SIXBIT	/J2NN/
	SIXBIT	/J2NP/
	SIXBIT	/J2NZ/
	SIXBIT	/J2O/
	SIXBIT	/J2P/
	SIXBIT	/J2Z/

	SIXBIT	/J3E/
	SIXBIT	/J3N/
	SIXBIT	/J3NN/
	SIXBIT	/J3NP/
	SIXBIT	/J3NZ/
	SIXBIT	/J3O/
	SIXBIT	/J3P/
	SIXBIT	/J3Z/

	SIXBIT	/J4E/
	SIXBIT	/J4N/
	SIXBIT	/J4NN/
	SIXBIT	/J4NP/
	SIXBIT	/J4NZ/
	SIXBIT	/J4O/
	SIXBIT	/J4P/
	SIXBIT	/J4Z/

	SIXBIT	/J5E/
	SIXBIT	/J5N/
	SIXBIT	/J5NN/
	SIXBIT	/J5NP/
	SIXBIT	/J5NZ/
	SIXBIT	/J5O/
	SIXBIT	/J5P/
	SIXBIT	/J5Z/

	SIXBIT	/J6E/
	SIXBIT	/J6N/
	SIXBIT	/J6NN/
	SIXBIT	/J6NP/
	SIXBIT	/J6NZ/
	SIXBIT	/J6O/
	SIXBIT	/J6P/
	SIXBIT	/J6Z/

	SIXBIT	/JAE/
	SIXBIT	/JAN/
	SIXBIT	/JANN/
	SIXBIT	/JANP/
	SIXBIT	/JANZ/
	SIXBIT	/JAO/
	SIXBIT	/JAP/
	SIXBIT	/JAZ/

	SIXBIT	/JBUS/
	SIXBIT	/JE/
	SIXBIT	/JG/
	SIXBIT	/JGE/
	SIXBIT	/JL/
	SIXBIT	/JLE/
	SIXBIT	/JMP/
	SIXBIT	/JNE/
	SIXBIT	/JNOV/
	SIXBIT	/JOV/
	SIXBIT	/JRED/
	SIXBIT	/JSJ/

	SIXBIT	/JXE/
	SIXBIT	/JXN/
	SIXBIT	/JXNN/
	SIXBIT	/JXNP/
	SIXBIT	/JXNZ/
	SIXBIT	/JXO/
	SIXBIT	/JXP/
	SIXBIT	/JXZ/

	SIXBIT	/LD1/
	SIXBIT	/LD1N/
	SIXBIT	/LD2/
	SIXBIT	/LD2N/
	SIXBIT	/LD3/
	SIXBIT	/LD3N/
	SIXBIT	/LD4/
	SIXBIT	/LD4N/
	SIXBIT	/LD5/
	SIXBIT	/LD5N/
	SIXBIT	/LD6/
	SIXBIT	/LD6N/
	SIXBIT	/LDA/
	SIXBIT	/LDAN/
	SIXBIT	/LDX/
	SIXBIT	/LDXN/

	SIXBIT	/MOVE/
	SIXBIT	/MUL/

	SIXBIT	/NOP/
	SIXBIT	/NUM/

	SIXBIT	/ORIG/
	SIXBIT	/OUT/

	SIXBIT	/SLA/
	SIXBIT	/SLAX/
	SIXBIT	/SLB/
	SIXBIT	/SLC/
	SIXBIT	/SRA/
	SIXBIT	/SRAX/
	SIXBIT	/SRB/
	SIXBIT	/SRC/

	SIXBIT	/ST1/
	SIXBIT	/ST2/
	SIXBIT	/ST3/
	SIXBIT	/ST4/
	SIXBIT	/ST5/
	SIXBIT	/ST6/
	SIXBIT	/STA/
	SIXBIT	/STJ/
	SIXBIT	/STX/
	SIXBIT	/STZ/

	SIXBIT	/SUB/

LASTOP	←← .-1
GOTOP:	0501	; ADD
	XWD  400000, ALF
		
	0105	; CHAR
	0571	; CMP1
	0572	; CMP2
	0573	; CMP3
	0574	; CMP4
	0575	; CMP5
	0576	; CMP6
	0570	; CMPA
	0577	; CMPX
	XWD  400000, CON
		
	0161	; DEC1
	0162	; DEC2
	0163	; DEC3
	0164	; DEC4
	0165	; DEC5
	0166	; DEC6
	0160	; DECA
	0167	; DECX
	0504	; DIV

	XWD  400000, END
	0361	; ENN1
	0362	; ENN2
	0363	; ENN3
	0364	; ENN4
	0365	; ENN5
	0366	; ENN6
	0360	; ENNA
	0367	; ENNX
	0261	; ENT1
	0262	; ENT2
	0263	; ENT3
	0264	; ENT4
	0265	; ENT5
	0266	; ENT6
	0260	; ENTA
	0267	; ENTX
	XWD  400000, EQU

	0601	; FADD
	0670	; FCMP
	0604	; FDIV
	0603	; FMUL
	0602	; FSUB

	0205	; HLT

	0044	; IN
	0061	; INC1
	0062	; INC2
	0063	; INC3
	0064	; INC4
	0065	; INC5
	0066	; INC6
	0060	; INCA
	0067	; INCX
	0043	; IOC

	0651	; J1E
	0051	; J1N
	0351	; J1NN
	0551	; J1NP
	0451	; J1NZ
	0751	; J1O
	0251	; J1P
	0151	; J1Z

	0652	; J2E
	0052	; J2N
	0352	; J2NN
	0552	; J2NP
	0452	; J2NZ
	0752	; J2O
	0252	; J2P
	0152	; J2Z

	0653	; J3E
	0053	; J3N
	0353	; J3NN
	0553	; J3NP
	0453	; J3NZ
	0753	; J3O
	0253	; J3P
	0153	; J3Z

	0654	; J4E
	0054	; J4N
	0354	; J4NN
	0554	; J4NP
	0454	; J4NZ
	0754	; J4O
	0254	; J4P
	0154	; J4Z

	0655	; J5E
	0055	; J5N
	0355	; J5NN
	0555	; J5NP
	0455	; J5NZ
	0755	; J5O
	0255	; J5P
	0155	; J5Z

	0656	; J6E
	0056	; J6N
	0356	; J6NN
	0556	; J6NP
	0456	; J6NZ
	0756	; J6O
	0256	; J6P
	0156	; J6Z

	0650	; JAE
	0050	; JAN
	0350	; JANN
	0550	; JANP
	0450	; JANZ
	0750	; JAO
	0250	; JAP
	0150	; JAZ

	0042	; JBUS
	0547	; JE
	0647	; JG
	0747	; JGE
	0447	; JL
	1147	; JLE
	0047	; JMP
	1047	; JNE
	0347	; JNOV
	0247	; JOV
	0046	; JRED
	0147	; JSJ

	0657	; JXE
	0057	; JXN
	0357	; JXNN
	0557	; JXNP
	0457	; JXNZ
	0757	; JXO
	0257	; JXP
	0157	; JXZ

	0511	; LD1
	0521	; LD1N
	0512	; LD2
	0522	; LD2N
	0513	; LD3
	0523	; LD3N
	0514	; LD4
	0524	; LD4N
	0515	; LD5
	0525	; LD5N
	0516	; LD6
	0526	; LD6N
	0510	; LDA
	0520	; LDAN
	0517	; LDX
	0527	; LDXN

	0107	; MOVE
	0503	; MUL

	0000	; NOP
	0005	; NUM

	XWD  400000, ORIG
	0045	; OUT

	0006	; SLA
	0206	; SLAX
	0606	; SLB
	0406	; SLC
	0106	; SRA
	0306	; SRAX
	0706	; SRB
	0506	; SRC

	0531	; ST1
	0532	; ST2
	0533	; ST3
	0534	; ST4
	0535	; ST5
	0536	; ST6
	0530	; STA
	0240	; STJ
	0537	; STX
	0541	; STZ

	0502	; SUB